//package com.jzo2o.orders.manager.Handler.OrdersHandler;
//
//import cn.hutool.core.util.RandomUtil;
//import cn.hutool.extra.spring.SpringUtil;
//import com.jzo2o.api.customer.AddressBookApi;
//import com.jzo2o.api.customer.dto.response.AddressBookResDTO;
//import com.jzo2o.api.foundations.ServeApi;
//import com.jzo2o.api.foundations.dto.response.ServeAggregationResDTO;
//import com.jzo2o.mvc.utils.UserContext;
//import com.jzo2o.orders.base.enums.OrderStatusEnum;
//import com.jzo2o.orders.base.model.domain.Orders;
//import com.jzo2o.orders.manager.model.dto.request.PlaceOrderReqDTO;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.BeanUtils;
//import org.springframework.data.redis.core.RedisTemplate;
//
//import java.time.LocalDate;
//
//import static com.jzo2o.orders.base.enums.OrderStatusEnum.NO_PAY;
//
///**
// * \* User: chy
// * \* Date: 2025/9/30  11:40
// * \* Description:订单填充处理Handler
// * \
// */
//@Slf4j
//public class OrderFillHandler extends OrdersHandler {
//
//    private String ORDER_NO = "%s%08d%02d%03d%02d";
//
//    private RedisTemplate redisTemplate;
//    private ServeApi serveApi;
//    private AddressBookApi addressBookApi;
//
//    public OrderFillHandler() {
//        this.redisTemplate = SpringUtil.getBean(RedisTemplate.class);
//        this.serveApi = SpringUtil.getBean(ServeApi.class);
//        this.addressBookApi = SpringUtil.getBean(AddressBookApi.class);
//    }
//
//    @Override
//    public void process(Orders order, PlaceOrderReqDTO reqDTO) {
//        log.info("订单填充处理Handler");
//        //1.先 生成订单号
//
//        //2.查询关于serve相关信息
//        ServeAggregationResDTO serve = serveApi.findById(reqDTO.getServeId());
//        BeanUtils.copyProperties(serve, order);
//        //设置服务id
//        order.setServeId(reqDTO.getServeId());
//        // 这里是订单id,因为拷贝,可能会覆盖所以这里设置
//        order.setId(getOrderId());
//
//        // 3.根据地址id查询地址信息
//        AddressBookResDTO address = addressBookApi.getAddressById(reqDTO.getAddressBookId());
//        //设置地址详细信息
//        String addressDetail = address.getProvince() + address.getCity() + address.getCounty() + address.getAddress();
//        order.setServeAddress(addressDetail);
//        //设置经纬度
//        order.setLocation(address.getLon() + "," + address.getLat());
//        //设置联系人信息
//        order.setContactsName(address.getName());
//        //设置联系人手机号
//        order.setContactsPhone(address.getPhone());
//
//        // 4. 其他信息 设置
//        //设置订单状态
//        order.setOrdersStatus(OrderStatusEnum.NO_PAY.getStatus());
//        //设置支付状态
//        order.setPayStatus(NO_PAY.getStatus());
//        //设置服务开始时间
//        order.setServeStartTime(reqDTO.getServeStartTime());
//        // 设置购买数量
//        order.setPurNum(reqDTO.getPurNum());
//        //设置用户 id
//        order.setUserId(UserContext.currentUserId());
//
//        handler.process(order, reqDTO);
//    }
//
//    /**
//     * 生成订单号逻辑
//     *
//     * @return
//     */
//    //todo:17位：2位年+8位序号+2位月+3位随机数+2位日序号每月重置！！！
//    // 例如：2400000002095552419
//    // 实现方案：序号通过Redis的INCR 命令实现。●increment(key) - 对指定key的值进行原子性+1操作
//    // key的组成：ORDER_SEQ:202412（年份+月份）每月重置：每个月key会变化，序号从1重新开始
//    private Long getOrderId() {
//        LocalDate now = LocalDate.now();
//        String year = now.getYear() + "";
//        //拿到月份
//        int monthValue = now.getMonthValue();
//        //拿到日
//        int day = now.getDayOfMonth();
//        //拼接key,用于保证订单号唯一,每个月重置
//        String key = "ORDER_SEQ:" + year + monthValue;
//        //拿到8位序号
//        Long increment = redisTemplate.opsForValue().increment(key);
//
//        return Long.parseLong(String.format(ORDER_NO, year, increment, monthValue, RandomUtil.randomInt(100, 999), day));
//
//    }
//}
